package demo1;

import java.util.Scanner;

public class TestDemo1 {
    //这时候 在 func2 内部会抛出异常，可以处理，就不需要 throws 来声明异常，方法内部自己处理
    int a = 1;

    public static void func2_2() {
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[11]);
        } catch (ArrayIndexOutOfBoundsException e) {

        }
    }

    public static void main(String[] args) {
        func2_2();
    }

    //这时候 在 func2 内部会抛出异常，但是又不处理（可能无法处理 参考 clone），所以需要 throws 来声明一下异常，让后面的人来处理
    public static void func2_1() throws ArrayIndexOutOfBoundsException {
        int[] arr = {1, 2, 3};
        System.out.println(arr[11]);
    }

    public static void main5(String[] args) {
        try {
            func2_1();
        } catch (ArrayIndexOutOfBoundsException e) {

        }
    }

    public static void func() throws ArrayIndexOutOfBoundsException {
        int k = 2;
        if (k == 2) {
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    public static void main4(String[] args) throws CloneNotSupportedException {
        int a = 1;
//        func();
        if (a == 1) {
            throw new CloneNotSupportedException();
        }
    }

    //    public static void main(String[] args) {
//        try(T t = new T) { // 不能这么写，看来还有一定问题
//            t.toString();
//        } catch (NullPointerException e) {
//
//        }
//    }
    public static void main2(String[] args) {
        try {
//            T t = null;
//            System.out.println(t.toString());
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        } finally {//无论是否catch finally 都会被执行，那么与外部 sout("2222")有什么区别？
            System.out.println("finally");
        }
        System.out.println("2222");
        return;
    }

    public static void main3(String[] args) {
        //放入 try 内部那将来一定会将其关闭
        int a = 1;
        try (Scanner scanner = new Scanner(System.in)) {
            System.out.println("123456");
            return;
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        } finally {//可以看见，就算return 了依然会执行, 因为都一部分代码无论什么情况 最终都会执行
//            scanner//error 因为这时候已经关闭了，所以不能调用
            System.out.println("finally");
        }
        System.out.println("2222");
        return;
    }

    public static String retNewStr1(String s) {
        StringBuilder sb = new StringBuilder();
        int len = 0;
        for (int i = 0; i < s.length(); i++) {
            boolean flag = true;//默认可以添加
            for (int j = 0; j < len; j++) {
                if (s.charAt(i) == sb.charAt(j)) {//相同则不加
                    flag = false;
                    break;
                }
            }
            if (flag) {
                sb.append(s.charAt(i));
                len++;
            }
        }
        return sb.toString();
    }

    public static String retNewStr2(String s) {
        StringBuilder sb = new StringBuilder();
        int len = 0;
        //arr[0] ... arr[25] arr[26] ... arr[51]
        //  'A'        'Z'     'a'         'z'
        char[] arr = new char[26 * 2];
        char[] sub = {'A', 'a'};
        for (int i = 0; i < s.length(); i++) {
            int flag = 0;//默认是大写字母
            if (Character.isLowerCase(s.charAt(i))) {
                flag = 1;
            }
            int index = flag * 26 + s.charAt(i) - sub[flag];//表示字符所对应的下标
            arr[index] += 1;
            if (arr[index] == 1) {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }

    public static void main1(String[] args) {
        System.out.println(retNewStr2("adcAdc"));
    }
}

class T {
    static {
        System.out.println("1111");
    }
}
